home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1996 March / EnigmA AMIGA RUN 05 (1996)(G.R. Edizioni)(IT)[!][issue 1996-03][Skylink CD IV].iso / earcd / assembler / progasm3.lha / SORGENTI7 / Lezione11n1b.s / Lezione11n1b.s
Text File  |  1995-10-23  |  5KB  |  160 lines

  1.  
  2. ; Lezione11n1.s -Routine di temporizzazione che permette di attendere un
  3. ;         certo numero di microsecondi usando un timer B del CIAA/B
  4.  
  5. ; Questa routine di test permette di verificare a quante linee video
  6. ; corrispondono un certo un certo numero di microsecondi.
  7. ; (la parte ROSSA dello schermo e' quella in cui viene eseguita la routine)
  8.  
  9.  
  10. MICS:    equ    2000        ; ~2000 microsecondi = ~2 millisecondi
  11.                 ; valore = mics/1,4096837
  12.                 ; 1 microsecondo = 1 sec/1 milione
  13.                 ; NOTA: per raffrontare questa routine con
  14.                 ; quella che attende le linee raster, fate
  15.                 ; conto che 200 millisecondi corrispondono
  16.                 ; circa a 5 linee di raster, 400 millisecondi
  17.                 ; a 9,5 linee, 600 millis. a 14 linee eccetera
  18.  
  19. Start:
  20.     move.l    4.w,a6        ; Execbase in a6
  21.     jsr    -$84(a6)    ; forbid
  22.     jsr    -$78(a6)    ; disable
  23.     LEA    $DFF000,A5
  24.  
  25. WBLANNY:
  26.     MOVE.L    4(A5),D0    ; $dff004 - VPOSR/VHPOSR
  27.     ANDI.L    #$1FF00,D0    ; con interessano solo i bit della linea vert.
  28.     CMPI.L    #$08000,D0    ; aspetta la linea $080
  29.     BNE.S    WBLANNY
  30.  
  31.     move.w    #$f00,$180(a5)    ; Colore zero ROSSO
  32.  
  33.     bsr.s    CIAMIC
  34.  
  35.     move.w    #$0f0,$180(a5)    ; Colore zero VERDE
  36.  
  37.     btst    #6,$bfe001
  38.     bne.s    WBLANNY
  39.  
  40.  
  41.     move.l    4.w,a6        ; Execbase in a6
  42.     jsr    -$7e(a6)    ; enable
  43.     jsr    -$8a(a6)    ; permit
  44.     rts
  45.  
  46. ;    Ecco la routine che aspetta un numero specifico di MICROSECONDI,
  47. ;    usando il timer B del CIAB. Per usare il timer B del CIAA basta
  48. ;    sostituire il "lea $bfd000,a4" con un "lea $bfe001,a4". Nel listato
  49. ;    e' gia' presente, basta togliere il punto e virgola, e metterlo
  50. ;    invece al CIAB base. Comunque e' meglio usare il CIAB perche' il
  51. ;    timer CIAA e' usato dal sistema operativo per vari compiti.
  52. ;       Infatti, se usate il timerB del ciaA, si blocca tutto!
  53.  
  54.  
  55. ;         ||||
  56. ;             p::|
  57. ;     ___     L '|
  58. ;    =___)____l_/|_
  59. ;      `()____ |_/ \
  60. ;             | * | )
  61. ;             :  /_/
  62. ;             `-//'
  63. ;             |   |
  64. ;             | | |
  65. ;             | | |
  66. ;             | | |
  67. ;            _|_|_|_
  68. ;           (___:___){TuRBo}
  69.  
  70. CIAMIC:
  71.     movem.l    d0/a4,-(sp)        ; salviamo i registri usati
  72.     lea    $bfd000,a4        ; CIAB base
  73.  
  74. ;     lea    $bfe001,a4        ; CIAA base - PERO' MANDA IN BLOCCO
  75.                     ; TUTTO, DATO CHE LO USA IL SISTEMA
  76.                     ; OPERATIVO! NON USATE IL TIMER B
  77.                     ; DEL CIAA, PER FAVORE!
  78.  
  79.     move.b  $f00(a4),d0        ; $bfde00 - CRB, CIAB control reg. B
  80.     andi.b   #%11000000,d0        ; azzera i bit 0-5
  81.     ori.b    #%00001000,d0        ; One-Shot mode (runmode singolo)
  82.     move.b  d0,$f00(a4)        ; CRB - Setta il registro di controllo
  83.     move.b  #%01111101,$d00(a4)    ; ICR - cancella gli interrupts CIA
  84.     move.b  #(MICS&$FF),$600(a4)    ; TBLO - metti il byte basso del time
  85.     move.b  #(MICS>>8),$700(a4)    ; TBHI - metti il byte alto del time
  86.     bset.b  #0,$f00(a4)        ; CRB - Start timer!!
  87. wait:
  88.     btst.b  #1,$d00(a4)    ; ICR - Attendiamo che il tempo sia scaduto.
  89.                 ; da notare che si testa il bit 1, e non lo
  90.                 ; zero, per attendere il timer B.
  91.     beq.s   wait
  92.     movem.l    (sp)+,d0/a4        ; ripristiniamo i registri
  93.     rts
  94.  
  95.     end
  96.  
  97. I sorgenti funzionano.... non vedo altro da dire... a parte il fatto che
  98. SE DISABILITATE GLI INTERRUPT CIA con move.w #$7f,ICR, prima di uscire li
  99. dovete riattivare, o il disk drive (e non solo) andra' malissimo...
  100.  
  101. Solo un'ultima cosa. Se eveste il tempo da aspettare in una label, potreste
  102. "spezzettarlo" in byte basso e byte alto con un lsr:
  103.  
  104.     lea    $bfd000,a4        ; cia_b base
  105.     move.w    TimerValue(PC),d0    ; countdown
  106.     move.b    d0,$600(a4)        ; timer B - set lo byte
  107.     lsr.w    #8,d0
  108.     move.b    d0,$700(a4)        ; timer B - set hi byte
  109.         ; 76543210
  110.     move.b  #%01111101,$d00(a4)    ; ICR - cancella gli interrupts CIA
  111.     move.b    #%00011001,$f00(a4)    ; CRB - start
  112.                     ; 7 - Alarm -> 0
  113.                     ; 6,5 - Inmode bits -> 00
  114.                     ; 4 - Load bit -> 1 (fa caricare al
  115.                     ;     timer il valore, e comincia
  116.                     ;     il conto alla rovescia).
  117.                     ; 3 - RunMode -> 1 (One shot, 1 volta)
  118.                     ; 2 - OutMode -> 0 (per ricev. pulse)
  119.                     ; 1 - PBON -> 0
  120.                     ; 0 - Start -> comuncia il conto alla
  121.                     ;     rovescia; giuto a 0->interrupt
  122.     MOVE.B    #%10000010,$d00(a4)    ; ICR - Abilita interr. timer B ciaB
  123. loop:
  124.     btst    #1,$d00(a4)        ; ICR - test tb-bit ->clear ICR
  125.     beq.s    loop            ; not set->wait
  126.     rts
  127.  
  128.  
  129. ; CIA:    ICR  (Interrupt Control Register)                [d]
  130. ;
  131. ; 0    TA        underflow
  132. ; 1    TB        underflow
  133. ; 2    ALARM        TOD alarm
  134. ; 3    SP        serial port full/empty
  135. ; 4    FLAG        flag
  136. ; 5-6    unused
  137. ; 7  R    IR
  138. ; 7  W    set/clear
  139. ;
  140. ; CIA:  CRA, CRB  (Control Register)                    [e-f]
  141. ;
  142. ; 0    START        0 = stop / 1 = start TA; {0}=0 when TA underflow
  143. ; 1    PBON        1 = TA output on PB / 0 = normal mode
  144. ; 2    OUTMODE        1 = toggle / 0 = pulse
  145. ; 3    RUNMODE        1 = one-shot / 0 = continous mode
  146. ; 4  S    LOAD        1 = force load (strobe, always 0)
  147. ; 5   A    INMODE        1 = TA counts positive CNT transition
  148. ;            0 = TA counts 02 pulses
  149. ; 6   A    SPMODE        serial port....
  150. ; 7   A    unused
  151. ; 6-5 B    INMODE        00 = TB counts 02 pulses
  152. ;            01 = TB counts positive CNT transition
  153. ;            10 = TB counts TA underflow pulses
  154. ;            11 = TB counts TA underflow pulses while CNT is high
  155. ; 7   B    ALARM        1 = writing TOD sets alarm
  156. ;            0 = writing TOD sets clock
  157. ;            Reading TOD always reads TOD clock
  158.  
  159.  
  160.